/////////////////////////////////////////////////////////////////////////////////////////////
// Filename: AppOwnedStates.h
// (c) Dave Ottley, 2012. All rights reserved.
/////////////////////////////////////////////////////////////////////////////////////////////
#ifndef APPOWNEDSTATES_H
#define APPOWNEDSTATES_H

#include "State.h"
class ApplicationLayer;
struct Telegram;

class MainMenuPlayState : public State<ApplicationLayer>
{
private:
	// Singleton
	MainMenuPlayState() {}
	MainMenuPlayState(const MainMenuPlayState&);
	MainMenuPlayState& operator=(const MainMenuPlayState& rhs);

public:
	static MainMenuPlayState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class MainMenuCreditsState : public State<ApplicationLayer>
{
private:
	MainMenuCreditsState() {}
	MainMenuCreditsState(const MainMenuCreditsState&);
	MainMenuCreditsState& operator=(const MainMenuCreditsState& rhs);

public:
	static MainMenuCreditsState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class MainMenuQuitState : public State<ApplicationLayer>
{
private:
	MainMenuQuitState() {}
	MainMenuQuitState(const MainMenuQuitState&);
	MainMenuQuitState& operator=(const MainMenuQuitState& rhs);

public:
	static MainMenuQuitState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class CreditsState : public State<ApplicationLayer>
{
private:
	CreditsState() {}
	CreditsState(const CreditsState&);
	CreditsState& operator=(const CreditsState& rhs);

public:
	static CreditsState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class QuitState : public State<ApplicationLayer>
{
private:
	QuitState() {}
	QuitState(const QuitState&);
	QuitState& operator=(const QuitState& rhs);

public:
	static QuitState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class PausedState : public State<ApplicationLayer>
{
private:
	PausedState() {}
	PausedState(const PausedState&);
	PausedState& operator=(const PausedState& rhs);

public:
	static PausedState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class GameplayLevelStartupState : public State<ApplicationLayer>
{
private:
	GameplayLevelStartupState() {}
	GameplayLevelStartupState(const GameplayLevelStartupState&);
	GameplayLevelStartupState& operator=(const GameplayLevelStartupState& rhs);

public:
	static GameplayLevelStartupState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class GameplayPlayState : public State<ApplicationLayer>
{
private:
	GameplayPlayState() {}
	GameplayPlayState(const GameplayPlayState&);
	GameplayPlayState& operator=(const GameplayPlayState& rhs);

public:
	static GameplayPlayState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class GameplayLevelCompleteState : public State<ApplicationLayer>
{
private:
	GameplayLevelCompleteState() {}
	GameplayLevelCompleteState(const GameplayLevelCompleteState&);
	GameplayLevelCompleteState& operator=(const GameplayLevelCompleteState& rhs);

public:
	static GameplayLevelCompleteState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class GameplayDeadState : public State<ApplicationLayer>
{
private:
	GameplayDeadState() {}
	GameplayDeadState(const GameplayDeadState&);
	GameplayDeadState& operator=(const GameplayDeadState& rhs);

public:
	static GameplayDeadState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class GameOverState : public State<ApplicationLayer>
{
private:
	GameOverState() {}
	GameOverState(const GameOverState&);
	GameOverState& operator=(const GameOverState& rhs);

public:
	static GameOverState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class GameCompleteState : public State<ApplicationLayer>
{
private:
	GameCompleteState() {}
	GameCompleteState(const GameCompleteState&);
	GameCompleteState& operator=(const GameCompleteState& rhs);

public:
	static GameCompleteState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};

class ApplicationGlobalState : public State<ApplicationLayer>
{
private:
	ApplicationGlobalState() {}
	ApplicationGlobalState(const ApplicationGlobalState&);
	ApplicationGlobalState& operator=(const ApplicationGlobalState& rhs);

public:
	static ApplicationGlobalState * GetInstance();
	virtual void Enter(ApplicationLayer * application);
	virtual void Execute(ApplicationLayer * application);
	virtual void Exit(ApplicationLayer * application);
	virtual bool OnMessage(ApplicationLayer * application, const Telegram& msg);

};
#endif